Skip to content

现代 C++ 新特性汇总:从 C++11 到 C++23 ​

从 C++11 开始,标准每三年发布一个版本,到 C++23 已有五个主要版本,累计引入上百个语言与标准库特性。本文是一张总览地图:每个版本的定位、代表特性与编译器支持入口,帮助快速建立全貌;各版本的详细说明与代码示例见系列分篇。

版本演进一览 ​

版本 定位 代表特性
C++11 major,现代 C++ 起点 内存模型、auto、lambda、智能指针、变参模板
C++14 minor,给 C++11 打补丁 泛型 lambda、make_unique、放松 constexpr
C++17 「中」版本 结构化绑定、if constexpr、CTAD、string_view/optional/variant
C++20 major 模块、概念、协程、范围(The Big Four)
C++23 minor,含金量不低 expected、print、generator、flat 容器、推导 this

各版本特性清单参照《A Tour of C++》附录的框架整理,并按标准原文核对归类。

C++11:现代 C++ 的起点 ​

详细内容见 C++11 新特性。

新的语言特性:

  • 内存模型——为现代硬件设计的底层抽象,是描述并发行为的基础
  • auto 和 decltype——避免类型名称的不必要重复
  • 右值引用与移动语义——std::move 标记可移动,资源窃取代替深拷贝
  • 统一初始化——对所有类型(几乎)完全一致的初始化语法
  • nullptr——给空指针一个专有名字
  • constexpr 函数——在编译期求值的函数
  • 用户定义字面量——为自定义类型提供字面量支持
  • lambda 表达式——匿名函数对象
  • 变参模板——处理任意个任意类型参数的模板
  • 模板别名——重命名模板并绑定部分模板参数
  • noexcept——明确承诺函数不抛异常
  • override 和 final——管理大型类层次结构的明确语法
  • static_assert——编译期断言
  • long long——至少 64 位的整数类型
  • 默认成员初始化器——数据成员的默认值
  • enum class——带作用域的强类型枚举

新的标准库特性:

  • unique_ptr 和 shared_ptr——依赖 RAII 的资源管理指针
  • 内存模型和 atomic 变量
  • thread、mutex、condition_variable 等——系统层级并发的类型安全封装
  • future、promise 和 packaged_task 等——一次性结果传递
  • tuple——匿名的简单复合类型
  • 类型特征(type trait)——元编程的基础构件
  • 正则表达式匹配
  • 随机数——引擎与分布分离的新框架
  • 时间——time_point 和 duration
  • unordered_map 等——哈希表
  • array——知道自己大小的定长数组
  • emplace 运算——容器内直接构造对象
  • exception_ptr——跨线程传递异常

C++14:minor 版本 ​

主要在给 C++11 打补丁,让使用更方便、对新手更友好。详细内容见 C++14 新特性。

新的语言特性:

  • 泛型的 lambda
  • lambda 捕获部分中使用表达式(初始化捕获)
  • 函数返回类型推导
  • 另一种类型推断:decltype(auto)
  • 放松的 constexpr 函数限制
  • 变量模板
  • 聚合类成员初始化
  • 二进制字面量:0b 或 0B 前缀
  • 数字分位符
  • deprecated 属性

新的标准库特性:

  • 共享的互斥体和锁:std::shared_timed_mutex
  • 元函数的别名(_t 后缀一族)
  • 关联容器中的异构查找
  • 标准自定义字面量(""s、""h 等)
  • 通过类型寻址多元组
  • std::make_unique、std::is_final 等较小特性

C++17:「中」版本 ​

本应是一个 major 版本,最终收敛为中等规模的更新。详细内容见 C++17 新特性。

新的语言特性:

  • 保证拷贝省略
  • 按值捕获 *this(P0018R3)
  • 超对齐类型的动态分配
  • 严格指定运算顺序
  • UTF-8 字符字面量(u8'a')
  • 十六进制浮点字面量
  • 折叠表达式
  • 泛型值模板参数(auto 模板参数)
  • 类模板参数的类型推导(CTAD)
  • 编译时 if(if constexpr)
  • 带有初始值设定项的选择语句
  • constexpr 匿名函数
  • inline 变量
  • 结构化绑定
  • 新的标准属性:[[maybe_unused]]、[[nodiscard]] 和 [[fallthrough]]
  • 用底层类型的值来初始化 enum 类型
  • 嵌套命名空间定义等小的扩展

新的标准库特性:

  • 文件系统(<filesystem>)
  • 并行算法
  • 数学特殊函数
  • string_view
  • std::byte(<cstddef>,库特性而非语言特性,常被误归入语言侧)
  • any
  • variant
  • optional
  • invoke()
  • to_chars() 和 from_chars()
  • 多态分配器(pmr)
  • scoped_lock
  • shared_mutex 等小的扩展

C++20:major 版本 ​

四个最重要的特性是 "The Big Four":模块、概念、协程、范围。详细内容见 C++20 新特性。

新的语言特性:

  • 模块
  • 概念
  • 协程
  • 可指定的初始值设定项(C99 功能的略微受限版本)
  • <=>(三向比较操作符)
  • 标准属性 [[no_unique_address]]、[[likely]] 和 [[unlikely]]
  • constexpr 函数中允许更多功能:new、union、try-catch、dynamic_cast 和 typeid
  • 保证编译时求值的 consteval 函数
  • 保证静态初始化的 constinit 变量
  • using 可用于带作用域的 enum
  • char8_t、lambda 模板参数等小的扩展

新的标准库特性:

  • 范围、视图和管道
  • printf() 风格的格式化:format() 和 vformat()
  • 日历和时区
  • span
  • source_location
  • 数学常数(<numbers>:pi、e、ln10 等)
  • 对 atomic 的许多扩展(原子浮点、wait/notify、atomic_ref)
  • barrier 和 latch
  • 特性测试宏
  • bit_cast<>
  • 位操作(popcount 等)
  • 更多的标准库函数成为 constexpr
  • 标准库中更多地使用 <=> 操作符
  • jthread、semaphore、midpoint、lerp、starts_with/ends_with 等小的扩展

C++23:minor 版本,含金量不低 ​

详细内容见 C++23 新特性。

新的语言特性:

  • 显式对象形参(推导 this)
  • if consteval / if not consteval
  • 多维下标运算符
  • static operator() 和 static operator[]
  • auto(x):语言中的衰退复制
  • lambda 表达式上的属性
  • 可选的扩展浮点类型:std::float{16|32|64|128}_t 和 std::bfloat16_t
  • std::size_t 字面量后缀 uz / z
  • #elifdef、#elifndef 与 #warning
  • 通过新属性 [[assume(表达式)]] 进行假设
  • 具名通用字符转义、可移植源文件编码为 UTF-8、行拼合之前修剪空白
  • 新语言功能特性测试宏

新的标准库特性:

  • 新的词汇类型 std::expected
  • std::print / std::println
  • std::generator
  • 「平铺」容器适配器:std::flat_map、std::flat_set 等
  • std::mdspan
  • std::optional 的单子式操作:or_else、and_then、transform
  • 栈踪迹(stacktrace)库
  • 新的范围折叠算法与范围适配器(enumerate、zip、chunk、slide 等)、ranges::to
  • std::move_only_function
  • std::spanstream
  • std::byteswap、std::to_underlying
  • string/string_view 的 contains、resize_and_overwrite
  • 禁止从 nullptr 构造 string_view
  • 关联容器的异质擦除等

C++26 展望 ​

C++26 已于 2025 年中完成特性冻结与委员会审定(2025 年 6 月索菲亚会议通过),正式文本预计 2026 年内发布。三个方向最值得关注:反射(P2996,编译期类型检查与生成)、契约(P2900,语言级前置/后置条件与断言)、std::execution(P2300,senders/receivers 并发框架)。编译器支持进度见 Compiler support for C++26。

编译器支持情况 ​

要点 ​

  • 选版本不必求新:GCC/Clang 对 C++17 的支持已经完备,C++20 的模块与协程在工具链层面仍需验证;新特性的可用性优先按特性测试宏判断,而不是按编译器版本号
  • C++11 与 C++17 是投入产出比最高的两档:前者奠定现代写法,后者的词汇类型与 if constexpr 直接改变日常代码风格
  • C++20/23 的新框架(协程、范围)在后续版本持续补库工具,选型时把「标准库配套是否齐全」纳入考量
最近更新

基于 VitePress 构建